// 生成随机延迟（3000 到 10000 毫秒）
function getRandomDelay(min = 3000, max = 10000) {
  return Math.floor(Math.random() * (max - min + 1)) + min;
}

// 定义三个任务，每个任务延迟时间为随机值
const tasks = [
  () => new Promise(resolve => {
    const delay = getRandomDelay();
    console.log(`任务1 开始 (延时 ${delay} 毫秒)`);
    setTimeout(() => {
      console.log("任务1 完成");
      resolve("任务1 完成");
    }, delay);
  }),
  () => new Promise(resolve => {
    const delay = getRandomDelay();
    console.log(`任务2 开始 (延时 ${delay} 毫秒)`);
    setTimeout(() => {
      console.log("任务2 完成");
      resolve("任务2 完成");
    }, delay);
  }),
  () => new Promise(resolve => {
    const delay = getRandomDelay();
    console.log(`任务3 开始 (延时 ${delay} 毫秒)`);
    setTimeout(() => {
      console.log("任务3 完成");
      resolve("任务3 完成");
    }, delay);
  })
];

// 顺序执行：使用 async/await 与 for...of 循环
async function executeSequentially(tasks) {
  console.log("【顺序执行】开始...");
  const results = [];
  for (const task of tasks) {
    const res = await task();
    results.push(res);
  }
  console.log("【顺序执行】所有任务完成。\n");
  return results;
}

// 并行执行：使用 Promise.all
async function executeInParallel(tasks) {
  console.log("【并行执行】开始...");
  // map() 立即调用所有任务（启动它们），然后 Promise.all 等待所有任务完成
  const results = await Promise.all(tasks.map(task => task()));
  console.log("【并行执行】所有任务完成。\n");
  return results;
}

async function runComparison() {
  console.log("开始对比顺序执行和并行执行的耗时...\n");

  let start = Date.now();
  await executeSequentially(tasks);
  let end = Date.now();
  console.log(`顺序执行总耗时: ${end - start} 毫秒\n`);

  start = Date.now();
  await executeInParallel(tasks);
  end = Date.now();
  console.log(`并行执行总耗时: ${end - start} 毫秒\n`);
}

runComparison();
